const int N = 200005;
int par[N], Rank[N];

int find(int x) {
    if(x == par[x]) return x;
    else return par[x] = find(par[x]);
} //路径压缩（与返回父亲节点）

void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if(x == y) return ;
    
    if(Rank[x] <= Rank[y]) par[x] = y;
    else par[y] = x;
    if(Rank[x] == Rank[y]) Rank[x]++;
} //秩优化 与 合并操作

int find(int x) {
    if(x == par[x]) return x;
    else return par[x] = find(par[x]);
}

bool same(int x, int y) {
    return find(x) == find(y);
}


for(int i=1;i<=n;i++)par[i]=i;//初始化！！！

/*合并反集
我朋友的朋友是我的朋友；
我敌人的敌人也是我的朋友。
E代表敌人
F代表朋友
*/
    for(int i=1;i<=m;i++){
        char s;cin>>s;
        int x,y;cin>>x>>y;
        if(s=='E'){
            unite(n+x,y);
            unite(n+y,x);
        }
        else{
            unite(x,y);
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++){
        if(par[i]==i){
            sum++;
        }
    }
